2: COMMENT ⊗ VALID 00017 PAGES 3: C REC PAGE DESCRIPTION 4: C00001 00001 5: C00004 00002 BEGIN PTPSER ↔ SUBTTL PTPSER - PAPER TAPE PUNCH SERVICE ROUTINES 6: C00006 00003 PTP SERVICE DISPATCH TABLE 7: C00007 00004 INITIALIZE CODE, RESET ALL REGISTERS 8: C00009 00005 ARE YOU HUNG UP? AH, ER, ARE YOU HUNG UP? HUNG UP? HUNG UP? HUNG UP? HUNG UP? HUNG UP? HUNG UP? 9: C00011 00006 2-PROCESSOR ROUTINES 10: C00012 00007 ROUTINE TO SET BITS IN IOS AND START DEVICE 11: C00015 00008 CLOCK INTERRUPT ROUTINES FOR PTP 12: C00017 00009 OUTPUT ROUTINES ARE DIVIDED INTO PARTS AND KINDS, DEPENDING ON 13: C00019 00010 IN THIS MODE, WE BRING 1 CHAR PER WORD IN AND PACK 4 TO A WORD 14: C00022 00011 THIS IS FOR REAL BINARY MODE, WITH CHECKSUMS AND ALL 15: C00024 00012 HERE, WE TRY TO FIT THE USER'S BUFFER INTO SYSTEM CORE 16: C00027 00013 COME HERE IF WE HAVE TO DO 2 SEPARATE BLT'S 17: C00029 00014 THIS ROUTINE SETS UP THE CRAZY DISPATCHES FOR EACH OF THE VARIOUS MODES OF OPERATION 18: C00033 00015 INTERRUPT SERVICE ROUTINES - OBOYOBOYOBOY! 19: C00036 00016 TYPE 2 - PUNCH PARITY AND DELETES AFTER CR, FF, VT AND HT 20: C00038 00017 LAST PAGE - PUNCH FEED HOLES, SHUT OFF PTP 21: C00042 ENDMK 22: C⊗; 24: BEGIN PTPSER ↔ SUBTTL PTPSER - PAPER TAPE PUNCH SERVICE ROUTINES 25: ; ROUTINES DESIGNED TO SERVE DUAL-PROCESSOR PUNCH SYSTEM 26: 27: ; PARAMETER ASSIGNMENTS . . . 28: 29: ; ACCUMULATORS 30: A←TAC 31: B←TAC1 32: C←AC1 33: D←DAT 34: COUNT←AC2 35: POINTR←AC3 36: 37: ; IOS BITS 38: PTPFT←←200 ; FEED AFTER EVERY BUFFERLOAD IS PUNCHED 39: PTPEN1←←2000 ; LAST BUFFERLOAD, FEED WHEN DONE 40: PTPPDN←←4000 ; PUNCH DELETE CODE NEXT 41: PTPERR←←10000 ; DEVICE PTP HUNG BIT 42: PTPBG1←←20000 ; SPECIAL 2ND LEVEL IOBEG FLAG 43: 44: ; CONO BITS . . . 45: PTPDON←←10 ; DONE FLAG 46: PTPNOT←←100 ; 'OUT OF TAPE' FLAG 47: 49: ; PTP SERVICE DISPATCH TABLE 50: 51: JRST PTPINI ; INITIALIZE 52: JRST PTPCLT ; HUNG TIME OUT, SET ERROR BIT 53: ↑PTPDSP: 54: JRST PTPREL 55: JRST PTPCLS ; CLOSE 56: JRST PTPOUT ; OUTPUT 57: JRST ILLINP ; INPUT ????? 58: 59: PTPREL: MOVSI IOS,DEVSBB+PTPERR 60: ANDCAM IOS,PTPIOS 61: POPJ PDP, 63: ; INITIALIZE CODE, RESET ALL REGISTERS 64: 65: PTPINI: MOVE A,[XWD PTPIBP,PTPIBP+1] 66: SETZM PTPIBP ; SET UP BLT POINTER TO ZERO PTPDDB 67: BLT A,PTPCSC ; FROM DEVOAD TO END OF PTPDDB 68: SYNINI PTPCSC ; CLEAR CONTROL CELLS TOO 69: SKIPE P2NUM ; DO WE HAVE A 2-PROCESSOR SYSTEM? 70: SETOM PTPMOD ; SET THE MODE FLAG IF WE DO 71: CONO PTP,0 ; SETTLE PTP CONTROL REGISTER 72: HLLZS PTPCN1 73: HLLZS PTPCN2 74: MOVEI TAC,PTPCN1 ;ASSUME P1 75: SKIPE PTPMOD ;P1? 76: MOVEI TAC,PTPCN2 ;NO. USING P2 77: MOVEM TAC,PTPCON ;SET ADDRESS OF INTERRUPT CHAIN CONSZ 78: POPJ P, 79: 80: ; CLOSE CODE 81: 82: PTPCLS: SETZ A, ; SET THE 'LAST UUO' BIT IN IOS 83: HRLZI IOS,IOEND ; THIS BIT 84: PUSHJ PDP,PTPSOS ; THIS ROUTINE HANDLES THAT 85: JRST OUT 86: 87: ; PTP OUTPUT CODE 88: 89: PTPOUT: TLNE IOS,IOBEG ; FIRST UUO? 90: TLZ IOS,PTPERR ; YES, ZERO HUNG DEVICE BIT 91: TLNE IOS,PTPERR ; CHECK FOR HUNG DEVICE 92: JRST PTPHNG 93: PTPO2: TLZE IOS,IOBEG ; FIRST OUTPUT? 94: JRST PTPSUD ; YES, FIGURE OUT CONFIGURATION NOW 95: PTPO1: JRST @PTPUDS ; EACH MODE HAS A DIFFERENT ROUTINE 96: 98: ; ARE YOU HUNG UP? AH, ER, ARE YOU HUNG UP? HUNG UP? HUNG UP? HUNG UP? HUNG UP? HUNG UP? HUNG UP? 99: 100: PTPHNG: PUSHJ PDP,HNGSTP ; PRINT 'DEVICE PTP OK?' AND HANG HIM UP 101: SETZ IOS, ; DON'T SET ANYTHING 102: HRLZI A,PTPERR+DEVSBB ; GOTTA CLEAR ERROR FLAG NOW 103: PUSHJ PDP,PTPSOD ; AFTER IT'S OVER, START UP AGAIN 104: JRST PTPO2 105: 106: ; COME HERE IF THE CLOCK TICKS 107: 108: PTPCLT: MOVEI DEVDAT,PTPDDB ; SET UP THIS FOR SETIOD 109: HRLZI IOS,PTPERR ; ERROR BIT WE WANT TO SET 110: SKIPE P2NUM ; IS P2 ACTIVE? 111: JRST PTPCL1 ; YES, DO SOMETHING 112: CONO PI,PTPOFF ; SHUT OFF PTP 113: ORB IOS,PTPIOS ; OR IN ERROR BIT 114: TLZE IOS,IOW ; ARE WE IN AN IO WAIT? 115: PUSHJ PDP,STTIOD ; YES, GET US OUT! 116: MOVEM IOS,PTPIOS ; RESTORE IOS 117: CONO PI,PTPON ; SPEED UP PTP, EVEN THOUGH IT IS HUNG 118: JRST CPOPJ1 ; SKIP RETURN, DON'T EXCITE HNGCHK 119: 120: PTPCL1: MOVEI B,1 ; WE ARE P1 121: PSYNC PTPCSC ; GET CONTROL OF IOS 122: ORB IOS,PTPIOS ; OR IN ERROR BIT 123: TLZE IOS,IOW ; ARE WE IN IO WAIT? 124: PUSHJ PDP,STTIOD ; YES, GET US OUT!! 125: MOVEM IOS,PTPIOS ; RESTORE IOS 126: AOS (PDP) ; SET TO SKIP RETURN 127: MOVEI B,1 ; RESTORE WHAT SETIOD CLOBBERED 128: XSYNC PTPCSC ; RELEASE CONTROL OF IOS 129: POPJ PDP, 131: ; 2-PROCESSOR ROUTINES 132: ; SET AND CLEAR BITS IN IOS 133: ; PUT BITS YOU WANT SET IN IOS, BITS YOU WANT CLEARED IN A (IN TAC) 134: 135: PTPSOS: SKIPE PTPMOD ; ARE WE IN 1 OR 2 PROCESSOR MODE 136: JRST PTPS1 ; 2-PROCESSORS, HARDER 137: CONO PI,PTPOFF ; SLOW DOWN PTP 138: ANDCAM A,PTPIOS ; ZERO OUT BITS IN A 139: ORB IOS,PTPIOS ; OR BITS BACK IN 140: CONO PI,PTPON ; SPEED UP PTP 141: POPJ PDP, 142: 143: PTPS1: MOVEM A,PTPPTR ; SAVE THIS ACCUMULATOR 144: MOVEI B,1 ; WE ARE P1 145: PSYNC PTPCSC ; GET CONTROL OF IOS 146: OR IOS,PTPIOS ; OR IN IOS BITS 147: ANDCM IOS,PTPPTR ; TAKE OUT REQUESTED BITS 148: MOVEM IOS,PTPIOS ; RESTORE IOS 149: XSYNC PTPCSC 150: POPJ PDP, 152: ; ROUTINE TO SET BITS IN IOS AND START DEVICE 153: 154: PTPSTD: SETZB A,IOS ; START DEVICE, SET NO IOS BITS 155: PTPSOD: OR IOS,[XWD IO,0] ; FIRST, OR IN OUTPUT BIT 156: LDB C,PDVTIM ; AND SET HUNG COUNT 157: DPB C,PDVCNT 158: SKIPE PTPMOD ; ARE WE RUNNING 1 OR 2 PROCESSORS TODAY? 159: JRST PTPSD1 ; 2 PROCESSORS 160: MOVEI B,PTPDON+PTPNOT ; ASK FOR INTERRUPTS UPON DONE OR OUT OF PAPER 161: CONO PI,PTPOFF ; SHUT OF PTP IF IT IS RUNNING 162: OR IOS,PTPIOS ; PUT BITS INTO IOS 163: ANDCM IOS,A ; TAKE BITS OUT 164: TLOE IOS,DEVSBB ; IS THE PTP ALREADY RUNNING? 165: JRST PTPSD2 ; YES, SKIP IT 166: HRRM B,@PTPCON ; SET INTERRUPT LOCATION 167: CONO PTP,PTPDON+PTPCHN ; ASK FOR A DONE INTERRUPT, SET PI CHANNEL 168: PTPSD2: MOVEM IOS,PTPIOS ; RESTORE IOS 169: CONO PI,PTPON ; SPEED UP PTP, WILL INTERRUPT NOW 170: POPJ PDP, 171: 172: PTPSD1: MOVEM A,PTPPTR ; SAVE THE BITS WE ARE TO CLEAR 173: PSYNC PTPCSC ; GET CONTROL OF IOS 174: OR IOS,PTPIOS 175: ANDCM IOS,PTPPTR ; CLEAR APPROPRIATE BITS 176: TLON IOS,DEVSBB ; SET DEVICE RUNNING NOW BIT. 177: SETOM PTPACT ; ASK P2 TO START PTP SINCE IT'S NOT ALREADY ON. 178: MOVEM IOS,PTPIOS ; RESTORE IOS 179: XSYNC PTPCSC ; RELEASE CONTROL OF IOS 180: POPJ PDP, 181: 182: ; ROUTINE TO SET BITS IN IOS, START DEVICE, AND WAIT FOR 183: ; DEVICE TO FINISH 184: 185: PTPIOW: SETZB A,IOS 186: PTPSOW: PUSHJ PDP,PTPSOD ; STORE IOS BITS AND START DEVICE 187: JRST WSYNC ; WAIT FOR DEVICE TO FINISH 189: ; CLOCK INTERRUPT ROUTINES FOR PTP 190: 191: 192: ;PDP-10 HERE WHEN PDP-6 HAS FINISHED BUFFER 193: ↑PTPP1: SETZM PTPSID ;CLEAR REQUEST 194: MOVEI DEVDAT,PTPDDB ; GET ADDRESS OF DEVICE DDP FOR SETIO 195: JRST STTIOD ; SET IO WAIT SATISFIED BIT 196: 197: ;PDP-6 HERE WHEN PDP-10 HAS SET PTPACT 198: ↑PTPP2: MOVE TAC,PTPACT ; ARE WE TO START THE DEVICE FOR P1? 199: JUMPE TAC,CPOPJ 200: SETZM PTPACT ; YES, FLAG IT STARTED 201: MOVEI DEVDAT,PTPDDB ; SET UP DEVDAT FOR PDVTIM 202: CONO PI,PTPOFF ; SHUT OFF PTP 203: HRLZI IOS,IO ; SET OUTPUT BIT IN IOS 204: OR IOS,PTPIOS 205: MOVEI C,PTPDON+PTPNOT ; ASK FOR INTERRUPTS UPON DONE OR OUT OF PAPER 206: ; TLOE IOS,DEVSBB ; IS PTP ALREADY RUNNING? 207: ; JRST PTPP2A ; YES, QUIT NOW 208: MOVEM IOS,PTPIOS ; NO, STORE IOS 209: CONO PTP,PTPDON+PTPCHN ; AND ASK FOR DONE INTERRUPT FROM PTP 210: HRRM C,@PTPCON ; SET UP CONSO LOCATION 211: PTPP2A: CONO PI,PTPON ; RESTORE PI CHANNEL 212: LDB C,PDVTIM ; RESET HUNG COUNT 213: DPB C,PDVCNT 214: POPJ PDP, 216: ; OUTPUT ROUTINES ARE DIVIDED INTO PARTS AND KINDS, DEPENDING ON 217: ; MODE OF OPERATION AND OTHER SUCH STUFF 218: 219: PTPK1: MOVEI A,5 ; SET UP CHARS PER WORD AS 5, ASCII MODE 220: CAIA 221: PTPK3: MOVEI A,6 ; BINARY MODE, 6 PER WORD 222: MOVEM A,PTPCPW ; CHARACTERS PER WORD 223: PTPK1F: PUSHJ PDP,DEVSTU ; SET UP COUNT AND POINTR TO USER'S CORE 224: JRST PTPK1A 225: PUSHJ PDP,PTPBBI ; BLT BUFFER INTO SYSTEM CORE 226: JRST PTPK1B ; NO ROOM IN THE INN . . . 227: PUSHJ PDP,ADVBFE ; FIT AS MANY BUFFERS IN NOW AS IS POSSIBLE 228: JRST PTPK1A 229: JRST PTPK1F 230: 231: PTPK1B: PUSHJ PDP,PTPIOW ; ASK TO START DEVICE AND WAIT 232: JRST PTPK1F 233: 234: PTPK2A: 235: PTPK1A: SKIPGE PTPBCN ; IS SYSTEM BUFFER EMPTY? 236: JRST PTPK1C ; NO, START DEVICE AND LEAVE 237: TLNN IOS,IOEND ; LAST UUO? 238: POPJ PDP, ; NO, LET HIM GIVE ANOTHER ONE 239: PTPK1D: SETZ A, ; SET THE 'PTP DISCONNECT' BIT IN IOS 240: HRLZI IOS,PTPEN1 ; TELLS INTERRUPT SERVICE TO FEED A LITTLE 241: JRST PTPSOD ; START DEVICE AND LEAVE 242: 243: PTPK1C: TLNE IOS,IOEND ; LAST UUO? 244: JRST PTPK1D ; YES, GO START DEVICE 245: PUSHJ PDP,DEVCR ; DOES HE HAVE ANOTHER BUFFER TO FILL 246: JRST PTPIOW ; NO, WAIT FIRST AND THEN LEAVE 247: JRST PTPSTD ; START DEVICE AND LEAVE 248: 250: ; IN THIS MODE, WE BRING 1 CHAR PER WORD IN AND PACK 4 TO A WORD 251: ; IN THE SYSTEM BUFFER 252: 253: PTPK2: PUSHJ PDP,DEVSTU ; SET UP POINTR TO USER BUFFER 254: JRST PTPK2A ; NOTHING THERE, LEAVE 255: CAILE COUNT,PTPBLN ; IF'N HE'S ASK'N MORE'N WE GOT . . . 256: JRST BTLERR ; FUCK'M! 257: MOVN A,PTPBCN ; IS THERE ROOM IN THE INN? 258: ADD A,COUNT ; ADD IN NUMBER OF WORDS TO BE TRANSFERRED 259: CAIL A,4*PTPBLN ; COMPARE WITH TOTAL CHAR COUNT 260: JRST PTPK2B ; CAN'T DO IT, LEAVE 261: MOVSI A,(<POINT =8,0>) ; SET UP POINTER TO SYSTEM BUFFER 262: HLLZ B,PTPUBP ; GET POINTER THAT IS ALREADY THERE 263: JUMPN B,.+2 ; IF NOT ALREADY SET UP . . . 264: HLLM A,PTPUBP ; SET IT UP!! 265: MOVEI B,1 266: PSYNC PTPCSC 267: 268: MOVE B,PTPUBP ; BRING UP TO AN ACCUMULATOR FOR SPEED 269: PTPK2C: MOVE A,B ; CHECK FOR WRAP-AROUND 270: IBP A 271: HRRZS A ; GET THE NEXT POINTED TO ADDRESS 272: CAIL A,PTPBUF+PTPBLN ; RUN OFF END OF BUFFER? 273: MOVE B,[POINT =8,PTPBUF] 274: 275: MOVE A,(POINTR) ; PICK UP CHARACTER (WORD) 276: IDPB A,B ; PACK INTO SYSTEM BUFFER 277: SOS PTPBCN ; UPDATE CHARACTER COUNT 278: AOJ POINTR, ; UPDATE USER CORE POINTER 279: SOJG COUNT,PTPK2C ; LOOP AROUND 280: 281: MOVEM B,PTPUBP ; STORE THIS BACK FOR NEXT TIME 282: MOVEI B,1 283: XSYNC PTPCSC 284: PUSHJ PDP,ADVBFE ; LOAD IN ANOTHER BUFFER IF POSSIBLE 285: JRST PTPK2A ; NOT POSSIBLE, EXIT 286: JRST PTPK2 ; GO THROUGH THE ENTIRE BIT AGAIN 287: 288: PTPK2B: PUSHJ PDP,PTPIOW ; START DEVICE AND WAIT UNTIL IT IS FINISHED 289: JRST PTPK2 ; THEN TRY AGAIN!! 290: 292: ; THIS IS FOR REAL BINARY MODE, WITH CHECKSUMS AND ALL 293: ; BLT IN A SINGLE BUFFER, PUNCH IT, THEN PUNCH CHECKSUM AND FEEDER 294: ; AFTER EVERY SINGLE BUFFERLOAD! 295: 296: PTPK4: HRRZ TAC1,PTPADR ; SET UP ADDRESS 297: PUSHJ PDP,CKS12 ; CALCULATE CHECKSUM OF BUFFER 298: ADDI TAC1,@PTPADR ; GET ADDRESS OF FIRST WORD OF DATA 299: HLLM TAC,@TAC1 ; PUT THE CHECKSUM NEXT TO THE WORD COUNT 300: PUSHJ PDP,DEVSTU ; SET UP POINTR AND COUNT 301: JRST PTPK4A ; NO BUFFERS TO EMPTY? 302: AOJ COUNT, ; FUDGE BY ONE TO LEAVE ROOM FOR CHECKSUM AND WORD COUNT WORD 303: SOJ POINTR, ; BACK POINTER UP BY ONE TOO 304: MOVEI A,6 ; BINARY MODE, 6 CHARS PER WORD 305: MOVEM A,PTPCPW 306: PUSHJ PDP,PTPBBI ; BRING IN A SINGLE BUFFER 307: JSP DAT,UERROR ; THERE BETTER BE ROOM!! 308: SKIPGE PTPBCN ; ANYTHING IN BUFFER? 309: JRST PTPK4B ; YES, PUNCH IT 310: PTPK4C: PUSHJ PDP,ADVBFE ; NO, IS THERE ANOTHER BUFFER? 311: POPJ PDP, ; NO, LET HIM FILL ONE 312: JRST PTPK4 ; YES, BRING IT IN 313: 314: PTPK4A: TLNE IOS,IOEND ; LAST UUO? 315: JRST PTPK1D ; YES, SHUDDER! 316: POPJ PDP, ; NO, LET HIM FILL SOME BUFFERS 317: 318: PTPK4B: HRLZI IOS,PTPFT ; THIS IS A 'FEED-WHEN-TERMINATING' SITUATION 319: SETZ A, ; SO TELL THE INTERRUPT SERVICE ABOUT IT 320: PUSHJ PDP,PTPSOW ; START DEVICE AND WAIT FOR IT TO STOP 321: JRST PTPK4C ; LOOP BACK AGAIN AND AGAIN 322: 324: ; HERE, WE TRY TO FIT THE USER'S BUFFER INTO SYSTEM CORE 325: 326: PTPBBI: JUMPE COUNT,CPOPJ1 ; ZERO-LENGTH BUFFER IS AN AUTOMATIC SUCCESS 327: CAILE COUNT,PTPBLN ; SEE IF HE WANTS MORE THAN WE CAN GIVE 328: JRST BTLERR ; YES, SCREW HIM! 329: MOVEI B,1 330: SKIPE PTPMOD ; FAST OR SLOW MODE? 331: JRST PTPZZ0 332: CONO PI,PTPOFF ; FAST MODE, DO CONO DIRECTLY 333: JRST PTPZZ1 334: PTPZZ0: PSYNC PTPCSC 335: PTPZZ1: MOVE A,PTPIBP ; PICK UP INTERRUPT LEVEL BYTE POINTER 336: IBP A ; THIS IS TO GET THE DISTANCE, IN WORDS, BETWEEN THE TWO POINTERS 337: HRRZS A ; WHICH IS THE NUMBER OF AVAILABLE WORDS IN THE BUFFER 338: MOVEI B,PTPBUF+PTPBLN ; WE ALSO NEED THE DISTANCE TO THE END OF THE BUFFER 339: SUB B,PTPUBP ; FOR WRAP-AROUND PURPOSES 340: SUB A,PTPUBP ; DISTANCE BETWEEN POINTERS 341: JUMPLE A,PTPBB6 ; POINTER WRAP-AROUND, SPECIAL CASE 342: PTPBB5: CAMGE A,COUNT ; SEE IF THERE IS ULTIMATLY ROOM 343: JRST PTPBB7 ; NO, FAILURE 344: JUMPE B,PTPBB2 ; IF ZERO, IT IS A SPECIAL CASE 345: HRLZ C,POINTR ; SET UP BLT WORD. SOURCE IS USER CORE 346: HRR C,PTPUBP ; DESTINATION IS SYSTEM CORE 347: CAMLE COUNT,B ; NOW WE DECIDE WHETHER WE MUST WRAP AROUND 348: JRST PTPBB1 ; YES, GO WRAP IT UP 349: HRRZ B,PTPUBP ; NO, GET LAST WORD TO BE TRANSFERRED 350: ADD B,COUNT ; BY ADDING THE SOURCE AND THE COUNT 351: BLT C,-1(B) ; AND SUBTRACTING ONE AT INDEX TIME 352: ADDM COUNT,PTPUBP ; UPDATE BUFFER CHARACTER POINTER 353: PTPBB3: IMUL COUNT,PTPCPW ; UPDATE BUFFER CHARACTER COUNT TOO 354: SUB COUNT,PTPBCN ; SUBTRACT OFF CURRENT COUNT 355: MOVNM COUNT,PTPBCN ; CORRECT SIGN AND STORE 356: AOS (PDP) ; SET TO SKIP, SUCCESS 357: PTPBB7: SKIPE PTPMOD 358: JRST PTPZZ3 359: CONO PI,PTPON 360: POPJ PDP, 361: PTPZZ3: XSYNC PTPCSC 362: POPJ PDP, 364: ; COME HERE IF WE HAVE TO DO 2 SEPARATE BLT'S 365: 366: PTPBB1: BLT C,PTPBUF+PTPBLN-1 ; FIRST BLT, TO END OF SYSTEM BUFFER 367: PTPBB2: MOVE C,COUNT ; PICK UP WORD COUNT 368: SUB C,B ; THIS IS NUMBER OF WORDS LEFT TO TRANSFER 369: ADDI B,(POINTR) ; THIS IS PLACE TO START TRANSFERRING FROM 370: HRLZS B ; SWAP IT 371: HRRI B,PTPBUF ; DESTINATION IS START OF BUFFER 372: BLT B,PTPBUF-1(C) ; TRANSFER REMAINDER OF BUFFER 373: HRROI C,-PTPBLN(COUNT) ; WORD COUNT, WRAPPED AROUND 374: ADDM C,PTPUBP ; UPDATE POINTER 375: JRST PTPBB3 376: 377: ; COME HERE IF THE DIFFERENCE OF THE TWO POINTERS IS NEGATIVE 378: 379: PTPBB6: JUMPN A,.+2 ; IF NON-ZERO, NOTHING TO WORRY ABOUT 380: SKIPN PTPBCN ; ZERO. HMMM. IF COUNT IS NOT ZERO, THEN THERE IS NO ROOM IN THE INN!! 381: ADDI A,PTPBLN ; ADD IN TOTAL BUFFER LENGTH 382: JRST PTPBB5 384: ; THIS ROUTINE SETS UP THE CRAZY DISPATCHES FOR EACH OF THE VARIOUS MODES OF OPERATION 385: 386: PTPSUD: PUSHJ PDP,PTPINI ; INITIALIZE TABLES 387: ANDI IOS,117 ; LEAVE ONLY THE MODE BITS IN IOS 388: TLO IOS,IO+PTPBG1 ; SET OUTPUT BIT AND FEED BIT 389: MOVEM IOS,DEVIOS(DEVDAT) 390: LDB A,PIOMOD ; PICK UP MODE BITS, BOTTOM 4 BITS IN IOS 391: JUMPE A,PTPSKA ; MODES 0 AND 1 ARE IDENTICAL 392: CAIN A,1 393: JRST PTPSKA 394: CAIN A,10 ; MODE 10 - IMAGE MODE, 1 BYTE PER WORD 395: JRST PTPSKB 396: CAIN A,13 ; MODE 13 - BINARY, NO CHECKSUMMING 397: JRST PTPSKC 398: CAIN A,14 ; MODE 14 - BINARY WITH CHECKSUMMING 399: JRST PTPSKD 400: JSP DAT,UERROR ; IT REALLY CAN'T GET HERE. - CAN IT? 401: 402: PTPSKA: MOVEI A,PTPK1 ; UUO LEVEL KIND 1 403: MOVE C,[POINT 7,PTPBUF] ; 7-BIT BYTES AT INTERRUPT LEVEL 404: MOVEI B,PTPT2 ; INTERRUPT LEVEL TYPE 2 405: TRNE IOS,100 ; CHECK FOR ALTERNATE MODES 406: MOVEI B,PTPT1 ; INT. LEVEL TYPE 1 - NON-PARITY 8TH HOLE, NO DELETES AFTER TABS 407: PTPSKE: MOVEM A,PTPUDS ; UUO-LEVEL DISPATCH ADDRESS 408: MOVEM B,PTPIDS ; INTERRUPT-LEVEL DISPATCH ADDRESS 409: MOVEM C,PTPIBP ; INTERRUPD-LEVEL BYTE POINTER 410: MOVEI A,PTPBUF ; SET UP UUO-LEVEL BUFFER POINTER 411: MOVEM A,PTPUBP ; NOT A BYTE POINTER, JUST AN ADDRESS 412: SETZM PTPBCN ; BUFFER IS EMPTY, CLEAR COUNT 413: JRST PTPO1 ; RETURN TO OUTPUT ROUTINE 414: 415: PTPSKB: MOVEI A,PTPK2 ; UUO LEVEL KIND 2, PACK USER BUFFER INTO SYSTEM BUFFER 416: MOVEI B,PTPT3 ; INT LEVEL TYPE 3, 8-BIT BYTES 417: MOVE C,[POINT =8,PTPBUF] 418: JRST PTPSKE 419: 420: PTPSKC: MOVEI A,PTPK3 ; UUO LEVEL KIND 3, BINARY MODES 421: MOVEI B,PTPT1 ; INT. LEVEL TYPE 1, PUNCH 8TH HOLE 422: MOVE C,[POINT 6,PTPBUF] ; 6-BIT BYTES, 6 TO A WORD 423: TRNE IOS,100 ; THIS EFFECTS THE ANAL-CRANIAL INVERSION 424: MOVEI B,PTPT3 ; THIS MEANS DON'T PUNCH 7TH OR 8TH HOLE AT ALL 425: JRST PTPSKE 426: 427: PTPSKD: TRNE IOS,100 428: JRST PTPSKC ; 100 BIT HERE MEANS SOMETHING ENTIRELY DIFFERENT 429: MOVEI A,PTPK4 ; UUO LEVEL KIND 4, CHECKSUMM A LOT 430: MOVEI B,PTPT1 ; INT. LEVEL TYPE 1, PUT IN 8TH HOLE ALWAYS 431: MOVE C,[POINT 6,PTPBUF] ; SET FOR 6-BIT BYTES 432: JRST PTPSKE 433: 435: ; INTERRUPT SERVICE ROUTINES - OBOYOBOYOBOY! 436: 437: ↑PTPINT: 438: JSR @PTPSAV ; SAVE ACCUMULATORS FIRST 439: MOVEI DEVDAT,PTPDDB ; SET UP DEVDAT FOR EVERYBODY'S BENEFIT 440: SKIPE PTPFCN ; ANY FEED COUNT LEFT? 441: JRST PTPFED ; GO PUNCH A FEED HOLE OR TWO 442: MOVEI B,2 ; WE ARE P2 443: SKIPN PTPMOD ; MUST WE SYNCHRONIZE? 444: JRST PTPZZ2 ; NO, SKIP IT 445: PSYNC PTPCSC 446: PTPZZ2: MOVE IOS,PTPIOS ; WE HAVE TO INSPECT THIS FIRST 447: TLZE IOS,PTPBG1 ; IS THIS THE FIRST BUFFERLOAD? 448: JRST PTPF1 ; YES, WE SHOULD PUNCH FEED FIRST 449: TLZE IOS,PTPPDN ; DO WE HAVE A DANGLING DELETE? 450: JRST PTPIDN ; YES, GO PUNCH IT 451: SKIPN PTPBCN ; IS THERE ANYTHING IN THE SYSTEM BUFFER? 452: JRST PTPOF ; NO, QUIT AND GO HOME 453: AOS PTPBCN ; DECREMENT CHAR COUNT 454: MOVE D,PTPIBP ; PICK UP BYTE POINTER 455: IBP D ; INCREMENT POINTER TO CHECK FOR WRAP-AROUND 456: HRRZ C,D ; GET ADDRESS PORTION 457: CAIL C,PTPBUF+PTPBLN ; IS BYTE POINTER OUT OF RANGE? 458: HRRI D,PTPBUF ; YES, RESET ADDRESS TO START OF BUFFER 459: LDB C,D ; PICK UP CHARACTER 460: MOVEM D,PTPIBP ; REPLACE BYTE POINTER 461: JRST @PTPIDS ; AND PUNCH IT CORRECTLY 462: 463: PTPT1: ORI C,200 ; TYPE 1 - ALWAYS PUNCH 8TH HOLE 464: PTPT3: DATAO PTP,C ; TYPE 3 - NO MODIFICATION AT ALL 465: LDB C,PDVTIM ; SET HUNG COUNT 466: DPB C,PDVCNT 467: PTPXIT: MOVEM IOS,PTPIOS ; THIS PROCESSOR OWNS IOS 468: SKIPN PTPMOD 469: POPJ PDP, 470: XSYNC PTPCSC 471: POPJ PDP, 473: ; TYPE 2 - PUNCH PARITY AND DELETES AFTER CR, FF, VT AND HT 474: 475: PTPT2: JUMPE C,PTPT3 ; TYPE 2 - PARITY AND DELETES AFTER THESE CHARACTERS 476: CAIE C,15 ; C.R. RATES A DELETE 477: CAIN C,11 ; V.T. RATES A DELETE FOR THE LOSING ASR35 478: TLO IOS,PTPPDN ; PUNCH DELETE NEXT TIME AROUND 479: CAIN C,13 ; V.T. 480: TLO IOS,PTPPDN 481: CAIN C,14 ; F.F. MEANS PUNCH A LOT OF FEED 482: JRST PTP2A 483: PTP2B: MOVE D,C ; NOW COMPUTE PARITY ON THE CHARACTER 484: IMULI D,200401 ; MAKE 3 COPIES OF THE NUMBER 485: AND D,[11111111] ; MAKES ONE COPY OF EACH BIT, EVERY 3RD BIT. NUMBER IS NOW SPREAD OUT 486: IMUL D,[11111111] ; ADD UP BITS IN LH 487: TLNE D,10 ; NOW, DO WE NEED PARITY? 488: IORI C,200 ; YES, INSERT IT 489: JRST PTPT3 ; AND PUNCH CHAR 490: 491: PTP2A: MOVNI D,30 ; PUNCH 30 FEED HOLES 492: MOVEM D,PTPFCN ; SET THIS IN OUR REGISTER 493: JRST PTP2B ; AND RETURN TO CALCULATE PARITY 494: 496: ; LAST PAGE - PUNCH FEED HOLES, SHUT OFF PTP 497: 498: PTPF2: MOVNI C,30 ; PUNCH 30 HOLES FOR MODE 14 499: CAIA 500: PTPF1: MOVNI C,100 ; STANDARD INITIAL AND FINAL FEED 501: MOVEM C,PTPFCN ; INTO FEED COUNT REGISTER 502: MOVEM IOS,PTPIOS ; STORE IOS 503: SKIPN PTPMOD 504: JRST PTPFED 505: XSYNC PTPCSC ; SLOW MODE, RELEAS CONTROL OF IOS 506: PTPFED: AOS PTPFCN ; DECREMENT FEED COUNT 507: DATAO PTP,[0] ; GIVE IT A FEED WORD 508: LDB C,PDVTIM ; SET HUNG COUNT 509: DPB C,PDVCNT 510: POPJ PDP, ; AND LEAVE 511: 512: PTPIDN: MOVEI C,377 ; PUNCH A DELETE, FLAG HAS BEEN CLEARED 513: JRST PTPT3 514: 515: PTPOF: TLZE IOS,PTPEN1 ; OH MAMA, CAN THIS REALLY BE THE END? 516: JRST PTPF1 ; IT IS, FEED BEFORE LEAVING 517: TLZE IOS,PTPFT ; IS THIS THE 'FEED WHEN TERMINATING' BIT? 518: JRST PTPF2 ; YES, DO IT 519: CONO PTP,0 ; CLEAR PTP REGISTERS 520: HLLZS @PTPCON ; DON'T CONFUSE INTERRUPT SERVICE DISPATCHES 521: SKIPE PTPMOD ; ARE WE IN FAST OR SLOW MODE? 522: JRST PTPOF1 ; SLOW MODE, SET A FLAG FOR P1 TO SEE 523: TLZE IOS,IOW ; ARE WE IN AN IO WAIT? 524: PUSHJ PDP,STTIOD ; YES, SET IO DONE 525: PTPOF2: TLZ IOS,DEVSBB ; CLEAR BUSY FLAG, ALTHOUGH NOONE LOOKS AT IT 526: SETZM PTPBCN ; BUFFER IS NOW EMPTY, MARK IT AS SUCH! 527: JRST PTPXIT 528: 529: PTPOF1: TLZE IOS,IOW ; ARE WE IN AN IO WAIT? 530: SETOM PTPSID ; YES, ASK TO CALL SETIOD FOR US 531: JRST PTPOF2 532: 533: BEND PTPSER